﻿' Boogaloo® - http://www.mindfly.com
' Copyright (c) 2008
' by Mindfly, Inc.
'
' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
' of the Software.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
' INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
' DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
' SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
' WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Imports System.Web
Imports System.IO
Imports Boogaloo.Base
Imports Boogaloo.Core.UI
Imports Boogaloo.Core.BLL

Namespace HttpModules


    Public Class EnforcePrimaryDomainModule
        Implements IHttpModule

#Region "HttpModule Members"


        Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
            AddHandler context.BeginRequest, AddressOf Context_BeginRequest
        End Sub

        Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

        End Sub

#End Region

        Public Sub Context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
            Dim context As HttpContext = CType(sender, HttpApplication).Context

            If context.Request.PhysicalPath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase) And Groove.site_root IsNot Nothing Then

                If Not Groove.site_root.enforce_primary_domain Then Exit Sub

                Dim admin_path As String = String.Format("/{0}/", Globals.Settings.Components("Core").Settings("ADMIN_Directory").Value.ToUpper.Replace("/", String.Empty).Replace("~", String.Empty))

                If Not String.Equals(context.Request.HttpMethod, "GET") Or context.Request.RawUrl.ToUpper.Contains(admin_path) Or context.Request.IsLocal Then Exit Sub

                Dim uri As Uri = context.Request.Url
                If Not String.Equals(uri.Host.ToLower(), Groove.site_root.primary_domain.domain_name.ToLower()) Then

                    Dim prot As String = uri.ToString().Substring(0, uri.ToString().IndexOf("://") + 3)
                    Dim redir_url As String = String.Format("{0}{1}{2}", prot, Groove.site_root.primary_domain.domain_name, context.Request.RawUrl)

                    If redir_url.EndsWith("default.aspx", StringComparison.OrdinalIgnoreCase) Then
                        redir_url = redir_url.ToLower().Replace("default.aspx", String.Empty)
                    End If

                    ' Permanently redirect
                    context.Response.Clear()
                    context.Response.StatusCode = 301
                    context.Response.AddHeader("location", redir_url)
                    context.Response.End()

                End If

            End If

        End Sub


    End Class

End Namespace